/* cat.c

   Compares two files. */

#include <stdio.h>
#include <syscall.h>

int main(int argc, char *argv[])
{
    int fd[2];

    if (argc != 3)
    {
        printf("usage: cmp A B\n");
        return EXIT_FAILURE;
    }

    /* Open files. */
    fd[0] = open(argv[1]);
    if (fd[0] < 0)
    {
        printf("%s: open failed\n", argv[1]);
        return EXIT_FAILURE;
    }
    fd[1] = open(argv[2]);
    if (fd[1] < 0)
    {
        printf("%s: open failed\n", argv[1]);
        return EXIT_FAILURE;
    }

    /* Compare data. */
    for (;;)
    {
        int pos;
        char buffer[2][1024];
        int bytes_read[2];
        int min_read;
        int i;

        pos = tell(fd[0]);
        bytes_read[0] = read(fd[0], buffer[0], sizeof buffer[0]);
        bytes_read[1] = read(fd[1], buffer[1], sizeof buffer[1]);
        min_read = bytes_read[0] < bytes_read[1] ? bytes_read[0] : bytes_read[1];
        if (min_read == 0)
            break;

        for (i = 0; i < min_read; i++)
            if (buffer[0][i] != buffer[1][i])
            {
                printf("Byte %d is %02hhx ('%c') in %s but %02hhx ('%c') in %s\n",
                       pos + i,
                       buffer[0][i], buffer[0][i], argv[1],
                       buffer[1][i], buffer[1][i], argv[2]);
                return EXIT_FAILURE;
            }

        if (min_read < bytes_read[1])
            printf("%s is shorter than %s\n", argv[1], argv[2]);
        else if (min_read < bytes_read[0])
            printf("%s is shorter than %s\n", argv[2], argv[1]);
    }

    printf("%s and %s are identical\n", argv[1], argv[2]);

    return EXIT_SUCCESS;
}
